import { genderDict, zodiacDict, horoscopeDict } from "@/utils/dict";

interface IdCardInfo {
  birthday: string;
  age: number;
  gender: string;
  areaCode: string;
  zodiac: string;
  horoscope: string;
}
/**
 * @description 通过身份证号获取生日，年龄，性别，生肖属相，星座，所属省市区的地区编码
 * @param {string} idNumber 身份证号
 * @param {string} dataName 回显的字典字段名（可能是value，或者label，也可能是别的需要的字段）
 * @param {boolean} codeBool 地区code是否要加到12位
 * @returns {object}
 */
export function getIdCardInfo(idNumber: string, dataName: string, codeBool: boolean): IdCardInfo {
  // 检查身份证是否有效
  if (!idNumber || idNumber.length !== 18 || !/^\d{17}(\d|X)$/.test(idNumber)) {
    throw new Error("无效的身份证号");
  }

  // 地区code是否开启补0到12位
  if (typeof codeBool !== "boolean") {
    throw new Error("codeBool 参数必须是布尔类型");
  }

  // 获取省市区code位于第1到6位
  const areaCode = codeBool ? `${idNumber.substring(0, 6)}000000` : idNumber.substring(0, 6);

  // 中国身份证号的出生日期位于第7到14位
  const birthdayStr = idNumber.substring(6, 14);

  // 将出生日期字符串格式化为年月日
  const year = birthdayStr.substring(0, 4);
  const month = birthdayStr.substring(4, 6);
  const day = birthdayStr.substring(6, 8);

  // 计算年龄
  const birthDate = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
  const today = new Date();
  let age = today.getFullYear() - birthDate.getFullYear();
  const monthDiff = today.getMonth() - birthDate.getMonth();
  if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }

  // 性别判断：奇数为男性，偶数为女性
  const genderCode = idNumber.charAt(16);
  const gender = genderDict[parseInt(genderCode) % 2][dataName] || "未知";

  // 计算生肖属相
  const birthYear = parseInt(year);
  const zodiacIndex = (birthYear - 4) % 12;
  const zodiac = zodiacDict[zodiacIndex][dataName] || "未知";

  // 计算星座
  const birthday = `${month}-${day}`;
  const horoscopeSign = horoscopeDict.find(
    horoscope =>
      (birthday >= horoscope.start && birthday <= horoscope.end) ||
      (horoscope.start === "12-22" && (birthday >= "12-22" || birthday <= "01-19")) ||
      (horoscope.end === "01-19" && (birthday >= "12-22" || birthday <= "01-19"))
  );
  const horoscope = horoscopeSign ? horoscopeSign[dataName] : "未知";

  return {
    birthday: `${year}-${month}-${day}`,
    age,
    gender,
    areaCode,
    zodiac,
    horoscope
  };
}

// 测试
// const infoValue = getIdCardInfo("441284199810050010", "value", true);
// const infoLabel = getIdCardInfo("429004199707243886", "label", true);
// console.log(infoValue);
// console.log(infoLabel);

/**
 * @param {*} dataField 需要回显的数据（可能是value:'1'或者label:'男'）
 * @param {*} dictList 字典列表的字段
 * @param {*} dictValueName 字典列表的 value的字段名
 * @param {*} dictLabelName 字典列表的 label的字段名
 * @param {*} dataName 返回的回显的字段（可能是dictValueName，或者dictLabelName，也可能是别的需要的字段）
 */

export function dictReturn(dataField, dictList, dictValueName, dictLabelName, dataName) {
  // 查找字典列表中匹配的项
  const item = dictList.find(item => item[dictValueName] === dataField || item[dictLabelName] === dataField);

  // 如果找到了匹配的项，返回指定的字段值
  return item ? item[dataName] : null;
}

// 测试
// console.log(dictReturn('1',horoscopeDict,'value','label','start'));

// 区间进度条计算，例如会员等级（多少经验达到多少等级）
export function calculateProgressPercentage(levels, progress) {
  // 确保进度值在第一个和最后一个等级之间
  if (progress < levels[0]) {
    return 0;
  }
  if (progress > levels[levels.length - 1]) {
    return 100;
  }

  // 查找进度所在的区间
  for (let i = 0; i < levels.length - 1; i++) {
    if (progress >= levels[i] && progress < levels[i + 1]) {
      // 计算区间的百分比
      const rangeStart = levels[i]; // 是当前进度所在区间的起始值
      const rangeEnd = levels[i + 1]; // 是当前进度所在区间的结束值
      const progressInRange = progress - rangeStart; //当前进度相对于区间起始值的进度
      const rangeLength = rangeEnd - rangeStart; // 是当前区间的长度
      const corridor = 100 / (levels.length - 1); // 每个区间所对应的百分比范围
      const percentageInRange = (progressInRange / rangeLength) * corridor; // 在当前区间内的进度百分比
      const totalPercentage = i * corridor + percentageInRange; // 计算总百分比
      return totalPercentage.toFixed(2); // 最终计算出的进度百分比，保留两位小数
    }
  }

  // 如果进度值恰好等于最后一个等级
  if (progress === levels[levels.length - 1]) {
    return 100;
  }

  return 0; // 默认情况下返回0
}

// 示例使用
// const levels = [100, 150, 300, 400, 500];
// const progress = 310;

// const percentage = calculateProgressPercentage(levels, progress);
// console.log(`进度条百分比: ${percentage}%`);

/**
 * @param {*} passModifyTime 密码修改日期 "2024-12-11"
 * @description 检查密码是否过期
 */
export function checkPasswordExpiry(passModifyTime) {
  const currentDate = new Date();
  let passwordValidityPeriod = 180; // 多少天有限期限
  let warningDaysBeforeExpiry = 15; // 多少天即将过期
  let passwordSetAt = new Date(passModifyTime); // 计算密码到期时间
  const passwordExpiryDate = new Date(passwordSetAt);
  passwordExpiryDate.setDate(passwordSetAt.getDate() + passwordValidityPeriod); // 计算距离到期还有多少天

  const timeDiff = passwordExpiryDate.getTime() - currentDate.getTime();
  const daysUntilExpiry = Math.ceil(timeDiff / (1000 * 60 * 60 * 24)); // 判断密码是否已过期

  const isExpired = currentDate > passwordExpiryDate; // 判断密码是否即将过期

  const willExpireSoon = daysUntilExpiry <= warningDaysBeforeExpiry && !isExpired;
  console.log(willExpireSoon);
  return {
    isExpired,
    willExpireSoon,
    daysUntilExpiry,
    expiryDate: passwordExpiryDate.toDateString()
  };
}

export const downloadFile = (res: BlobPart, fileName: string): void => {
  const blob = new Blob([res]);

  if ("download" in document.createElement("a")) {
    // 非 IE 下载
    const elink = document.createElement("a");
    elink.download = fileName;
    elink.style.display = "none";
    elink.href = URL.createObjectURL(blob);
    document.body.appendChild(elink);
    elink.click();
    URL.revokeObjectURL(elink.href);
    document.body.removeChild(elink);
  } else {
    // IE10+ 下载
    if (navigator.msSaveBlob) {
      navigator.msSaveBlob(blob, fileName);
    } else {
      console.error("您的浏览器不支持文件下载！");
    }
  }
};
